﻿using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.CotizarArticulos;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Unidad;
using CalculoPreciosUnitarios.Logica.GestorObject.CotizarArticulos;
using CalculoPreciosUnitarios.Logica.GestorObject.Unidad;
using System;

namespace CalculoPreciosUnitarios.Ventanas.Unidad
{
    /// <summary>
    /// Lógica de interacción para Unidad.xaml
    /// </summary>
    public partial class W_Unidad : Window
    {
        #region Property

        //Bases de Datos
        UnidadBD unidadDB = new UnidadBD();

        //Variables
        UnidadCS _unidad = new UnidadCS();
        List<UnidadCS> _unidades = new List<UnidadCS>();


        #endregion

        #region Contructor

        public W_Unidad()
        {
            InitializeComponent();

            DataContext = _unidad;
            _unidad.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(unidadPropertyChanged);
        }

        #endregion

        #region Windows Methods

        #region Botones

        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            Salir();
        }

        private void btnAgregarUnidad_Click(object sender, RoutedEventArgs e)
        {
            AgregarUnidad();
        }

        private void btnModificarUnidad_Click(object sender, RoutedEventArgs e)
        {
            ModificarUnidad();
        }

        private void btnEliminarUnidad_Click(object sender, RoutedEventArgs e)
        {
            EliminarUnidad();
        }

        private void btnCambiarCodigoUnidad_Click(object sender, RoutedEventArgs e)
        {
            CambiarCodigoUnidad();
        }

        #endregion

        #region Eventos

        private void codigoUnidadValue_TextChanged(object sender, TextChangedEventArgs e)
        {
            string auxCodigoUnidad = AdaptarString(this.codigoUnidadValue.Text);

            if (auxCodigoUnidad.Length > 0 && auxCodigoUnidad.Length < 5)
            {
                UnidadCS auxUnidad = new UnidadCS();
                auxUnidad.IdUnidad = auxCodigoUnidad;

                _unidad = unidadDB.ObtenerUnidadPorCodigo(auxUnidad);

                if (_unidad.IdUnidad.Trim().Equals(""))
                {
                    BotonesUnidadModoAgregar();
                }
                else
                {
                    BotonesUnidadModoModificar();
                }

                this.detalleUnidadValue.Text = _unidad.Descripcion;
                CargarUnidades();
            }
        }

        private void dataGridUnidades_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            UnidadCS auxUnidad = (UnidadCS)dataGridUnidades.SelectedItem;

            if (dataGridUnidades.SelectedIndex >= 0)
            {
                _unidad = unidadDB.ObtenerUnidadPorCodigo(auxUnidad);

                this.codigoUnidadValue.Text = _unidad.IdUnidad;
                this.detalleUnidadValue.Text = _unidad.Descripcion;
            }
        }

        private void unidadPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (this.codigoUnidadValue.Text.Length > 1)
            {
                btnAgregarUnidad.IsEnabled = _unidad.IsValid();
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            CargarUnidades();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F3":
                    if (btnAgregarUnidad.IsEnabled)
                    {
                        AgregarUnidad();
                    }
                    break;
                case "F4":
                    if (btnModificarUnidad.IsEnabled)
                    {
                        ModificarUnidad();
                    }
                    break;
                case "F5":
                    if (btnEliminarUnidad.IsEnabled)
                    {
                        EliminarUnidad();
                    }
                    break;
                case "F6":
                    if (btnCambiarCodigoUnidad.IsEnabled)
                    {
                        CambiarCodigoUnidad();
                    }
                    break;
                case "ESCAPE":
                    Salir();
                    break;
                default:
                    return;
            }
        }

        #endregion

        #endregion

        #region Auxiliar Methods

        private void AgregarUnidad()
        {
            _unidad.IdUnidad = AdaptarString(this.codigoUnidadValue.Text);
            //_unidad.IdUnidad = RellenarCodigo(_unidad.IdUnidad);
            _unidad.Descripcion = AdaptarString(this.detalleUnidadValue.Text);

            if (_unidad.Descripcion.Equals(""))
            {
                MessageBox.Show("La descripcion no puede ser vacia", "Atencion");
                return;
            }

            int resultadoConsulta = unidadDB.AddUnidad(_unidad, true);

            CargarUnidades();
            LimpiarCampos();
        }

        private void ModificarUnidad()
        {
            _unidad.IdUnidad = AdaptarString(this.codigoUnidadValue.Text);
            //_unidad.IdUnidad = RellenarCodigo(_unidad.IdUnidad);
            _unidad.Descripcion = AdaptarString(this.detalleUnidadValue.Text);

            int resultadoConsulta = unidadDB.UpdateUnidad(_unidad, _unidad);
            CargarUnidades();
        }

        private void EliminarUnidad()
        {
            CotizarArticulosDB cotizarDB = new CotizarArticulosDB();
            List<CotizarArticulosCS> cotizaciones = new List<CotizarArticulosCS>();

            string mensajeResultado = "Seguro quiere eliminar la Unidad ";

            UnidadCS auxUnidad = new UnidadCS();
            auxUnidad.IdUnidad = AdaptarString(this.codigoUnidadValue.Text);
            _unidad = unidadDB.ObtenerUnidadPorCodigo(auxUnidad);

            mensajeResultado += _unidad.Descripcion + " ?\n";

            MessageBoxResult resultadoMensaje = MessageBox.Show(mensajeResultado, "Eliminar Unidad",MessageBoxButton.YesNoCancel);

            if (resultadoMensaje.ToString().ToUpper().Equals("YES"))
            {
                cotizaciones = cotizarDB.ObtenerCotizarArticuloPorUnidad(_unidad);

                if (cotizaciones.Count > 0)
                {
                    string mensajeResultado2 = "No se puede eliminar " + _unidad.Descripcion + "\n" +
                        "Esta relacionada con las siguientes cotizaciones:\n";

                    int limite = 30;

                    if (cotizaciones.Count < limite)
                    {
                        foreach (CotizarArticulosCS item in cotizaciones)
                        {
                            mensajeResultado2 += "Articulo: " + item.IdArticulo + " Rubro: " + item.IdRubro + " Sub Rubro: " 
                                + item.IdSubRubro + "\n";
                        }

                    }
                    else
                    {
                        int i;
                        for (i = 0; i < limite; i++)
                        {
                            mensajeResultado2 += "Articulo: " + cotizaciones[i].IdArticulo + " Rubro: " + cotizaciones[i].IdRubro 
                                + " Sub Rubro: " + cotizaciones[i].IdSubRubro + "\n";
                        }
                        mensajeResultado2 += "Y otras " + (cotizaciones.Count - limite) + " cotizaciones mas\n";
                    }
                    MessageBox.Show(mensajeResultado2, "Eliminar Unidad", MessageBoxButton.OK);
                    return;
                    
                }

                int resultado = unidadDB.EliminarUnidad(_unidad);

                if (resultado > 0)
                {
                    MessageBox.Show("Unidad " + _unidad.Descripcion + " ELIMINADA!");
                }
            }
            CargarUnidades();
            LimpiarCampos();
        }

        private void CambiarCodigoUnidad()
        {
            string codigoUnidad = AdaptarString(this.codigoUnidadValue.Text);
            if (!codigoUnidad.Equals(""))
            {
                UnidadCS auxUnidad = new UnidadCS();
                auxUnidad.IdUnidad = _unidad.IdUnidad;
                string newCodigo = Microsoft.VisualBasic.Interaction.InputBox("Ingrese el nuevo Codigo a sustituir", "Nuevo Codigo", _unidad.IdUnidad, 10, 10);
                if (!newCodigo.Trim().Equals(""))
                {
                    newCodigo = AdaptarString(newCodigo);
                    //newCodigo = newCodigo.PadLeft(4, '0');

                    if (newCodigo.Length > 4)
                    {
                        MessageBox.Show("No puede poner un codigo mayor a 4 caracteres", "Atencion", MessageBoxButton.OK, MessageBoxImage.Information);
                        return;
                    }

                    UnidadCS auxNuevaUnidad = new UnidadCS();
                    auxNuevaUnidad.IdUnidad = newCodigo;

                    auxNuevaUnidad = unidadDB.ObtenerUnidadPorCodigoExacto(auxNuevaUnidad);

                    if (auxNuevaUnidad.IdUnidad.Equals(""))
                    {
                        auxNuevaUnidad.IdUnidad = newCodigo; //.PadLeft(4,'0');
                        unidadDB.CambiarCodigoUnidad(auxUnidad, auxNuevaUnidad);
                        this.codigoUnidadValue.Text = newCodigo; //.PadLeft(4,'0');
                    }
                    else
                    {
                        MessageBox.Show("El codigo " + auxNuevaUnidad.IdUnidad.ToUpper() + " esta siendo utilizado por la Unidad " + auxNuevaUnidad.Descripcion.ToUpper());
                    }
                }
                else
                {
                    this.codigoUnidadValue.Text = auxUnidad.IdUnidad;
                }

            }
            else
            {
                MessageBox.Show("Debe cargar un codigo de Unidad", "Cambiar Codigo de Unidad");
            }
            CargarUnidades();
        }

        private void Salir()
        {
            this.Close();
        }

        private void CargarUnidades()
        {
            _unidades = unidadDB.obteneUnidades();

            IComparer<UnidadCS> comparer = new MyOrderingUnidad();

            if (_unidades.Count > 0)
            {
                _unidades.Sort(comparer);

                dataGridUnidades.ItemsSource = _unidades;

            }
            else
            {
                dataGridUnidades.ItemsSource = new List<UnidadCS>();
            }

            dataGridUnidades.Items.Refresh();
        }

        #region Botones

        private void BotonesUnidadModoAgregar()
        {
            btnAgregarUnidad.IsEnabled = true;
            btnModificarUnidad.IsEnabled = false;
            btnCambiarCodigoUnidad.IsEnabled = false;
            btnEliminarUnidad.IsEnabled = false;
        }

        private void BotonesUnidadModoModificar()
        {
            btnAgregarUnidad.IsEnabled = false;
            btnModificarUnidad.IsEnabled = true;
            btnCambiarCodigoUnidad.IsEnabled = true;
            btnEliminarUnidad.IsEnabled = true;
        }

        #endregion

        private string AdaptarString(string cadena)
        {
            return cadena.Trim().ToUpper();
        }

        private string RellenarCodigo(string codigo)
        {
            return codigo.PadLeft(4, '0');
        }

        private void LimpiarCampos()
        {
            this.codigoUnidadValue.Text = "";
            this.detalleUnidadValue.Text = "";
        }

        #endregion

        


    }
}
